package com.oa.base;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Criteria; 
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

/**
 * @author FengMengHuo
 * @param <T> 要实现的 类的对象
 * 这是个 基础Dao 的实现类
 */
@SuppressWarnings("unchecked")
public class BaseDaoImpl<T> implements BaseDao<T> {

	// 通过spring注入 SessionFactory
	@Resource
	private SessionFactory sessionFactory ;
	//定义访问修饰符为 受保护 便于子类 调用使用
	protected Session getSession(){
		System.out.println(sessionFactory+"-----");
		return sessionFactory.getCurrentSession();
	}
	 // 定义私有的类对象
	private Class<T> clazz ;
	//通过默认的构造方法来 初始相对应的 类
	public BaseDaoImpl() {
		//获取泛型的父类
		ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
		//获取泛型父类的第一个参数
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
		//打印输出 传过来的 类的名字是否对
		System.out.println("clazz = " + clazz.getName()); 
	}
	
	//=========================下面是一些操作 增删改查 的公共操作==================================
	
	// 保存实体
	public boolean saveEntity(T t) {
		try{
			getSession().save(t);
			return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}

	// 修改实体
	public boolean updateEntity(T t) {
		try{
			getSession().update(t);
			return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}

	// 删除实体
	public boolean deleteEntity(T t) {
		try{
			getSession().delete(t);
			return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}

	// 立即查询实体
	public T getEntity(String id) {
		return (T) getSession().get(clazz, id);
	}

	// 延迟查询实体
	public T loadEntity(String id) {
		System.out.println(clazz+"==================="+id);
		return (T) getSession().load(clazz, id);
	}

	// 根据Ids 查询所有实体
	public List<T> getEntityByIds(String[] ids) {
		/**
		 * EMPTY_LIST 是Collections定义的一个静态属性，是一个类变量，可以直接返回使用  
		 * public static final List EMPTY_LIST = new EmptyList();  
		 * 这个是emptyList的代码  
		 * public static final <T> List<T> emptyList() {  
		 * 			return (List<T>) EMPTY_LIST;  
		   }  
		*/
		if (ids == null || ids.length == 0) {
			return Collections.EMPTY_LIST; // Collections是一个 工具 ，返回一个 空的集合 不能进行 add 等方法的操作
		}

		return getSession().createQuery(
				"FROM " + clazz.getSimpleName() + " WHERE unique_id IN(:ids)")
				.setParameterList("ids", ids)
				.list();
	}

	// 查询所有实体
	public List<T> findAllEntity() {
		System.out.println(clazz.getSimpleName());
		//System.out.println(getSession()+"===");
		return getSession().createQuery(
				"FROM " + clazz.getSimpleName())
				.list();
	}

	// 查询唯一的实体
	public T uniqueResultEntity(String hql, Object... objects) {
		Query q = getSession().createQuery(hql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		return (T) q.uniqueResult();
	}

	@SuppressWarnings("hiding")
	//分页查询
	public <T> List<T> queryForPage(T t, int offset, int length) {
		Criteria c =getSession().getSessionFactory().
				getCurrentSession().createCriteria(t.getClass());
		try {
			if(t.getClass().newInstance()!=null&&!"".equals(t.getClass().newInstance())){
				c.add(Restrictions.eq("",t.getClass().newInstance()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		c.setFirstResult(offset).setMaxResults(length);
        List<T> list = c.list();
          return list;
	}

	//查询所有记录数
	public int getAllRowCount(Object t) {
		Criteria c =getSession().getSessionFactory().getCurrentSession()
				.createCriteria(t.getClass());
		try {
			if(t.getClass().newInstance()!=null&&!"".equals(t.getClass().newInstance()))
				c.add(Restrictions.eq("", t.getClass().newInstance()));
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return c.list().size();
	}


}
